﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.utils;

namespace l1cs.server.model.gametime
{
    public class L1GameTime
    {
        /// <summary>ゲーム時間の始点となるリアル時間</summary>
        private readonly DateTime BASE_TIME_IN_REAL = DateTime.Parse( "2003/07/03 12:00:00" );

        /// <summary>秒単位のタイマ刻み数</summary>
        private int _time;

        /// <summary>ゲーム内時間</summary>
        private DateTime _dateTime;

        /// <summary>
        /// 現在の時間からゲーム時間を計算する。
        /// </summary>
        public L1GameTime()
        {
            TimeSpan t1 = DateTime.UtcNow - BASE_TIME_IN_REAL;
            if ( t1.Ticks < 0 )
            {
                throw new ArgumentNullException();
            }
            int t2 = (int)( t1.TotalSeconds * 6 );
            int t3 = t2 % 3; // 時間が3の倍数になるように調整
            _time = t2 - t3;
            _dateTime = new DateTime().AddSeconds( t2 - t3 );
        }

        /// <summary>
        /// ゲーム時間の経過秒数を返す。
        /// </summary>
        /// <returns>経過秒数</returns>
        public int getSeconds()
        {
            return _time;
        }

        /// <summary>
        /// ゲーム時間を返す。
        /// </summary>
        /// <returns>ゲーム時間</returns>
        public DateTime getDateTime()
        {
            return _dateTime;
        }

        /// <summary>
        /// ゲーム時間の時間部分を返す。
        /// </summary>
        /// <returns>ゲーム時間</returns>
        public TimeSpan toTime()
        {
            return _dateTime.TimeOfDay;
        }

        /// <summary>
        /// ゲーム内が夜かどうか？
        /// </summary>
        /// <returns>夜ならTrue</returns>
        public bool isNight()
        {
            int hour = _dateTime.Hour;
            return !IntRange.includes( hour, 6, 17 ); // 6:00-17:59(昼)で無ければtrue
        }

        override public String ToString()
        {
            return _dateTime.ToString( "yyyy.MM.dd日(dddd) HH:mm:ss z" );
        }
    }
}
